#pragma once

#include <emath.hpp>
#include <typedef.h>
//
#include <Eigen>

class Quaternion
{
public:
	// 构造函数
	Quaternion();

	// 构造函数4维向量
	Quaternion(const Eigen::Vector4d& v);

	// 构造函数其它四元数
	Quaternion(const Quaternion& other);

	// 构造函数普通数值
	Quaternion(double q0, double q1, double q2, double q3);

	// 析构函数
	virtual ~Quaternion();

	// 自身归一化
	void Normalize(void);

	// 单位化(1, 0, 0, 0)
	void Unit(void);

	// 返回归一化结果，自身不变
	Quaternion Normalized(void);

	// 求四元数的一阶导
	Eigen::Vector4d Derivative1(Eigen::Vector3d w);

	// 四元数转欧拉角
	Eigen::Vector3d ToToEulerAngles(void);

	double& operator()(int index);

	Quaternion operator+(const Quaternion& other);
	Quaternion operator+=(const Quaternion& other);

	Quaternion operator+(const Eigen::Vector4d& other);
	Quaternion operator+=(const Eigen::Vector4d& other);

	Quaternion operator*(const Quaternion& other);
	Quaternion operator*=(const Quaternion& other);

	Quaternion operator*(const double& other);
	Quaternion operator*=(const double& other);

private:
	Eigen::Vector4d m_Q;
};
